package monitormercado.negocio.analise.ranking;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;

import monitormercado.negocio.Tick.ControladorTick;
import monitormercado.negocio.Tick.Tick;
import monitormercado.util.Configuracao;
import monitormercado.util.Util;

public class RankingRetorno {
	public static final int DIARIO = 0;
	public static final int SEMANAL = 1;
	public static final int MENSAL = 2;
	public static final int ANUAL = 3;
	public static final int TOTAL = 4;

	private List<ItemRanking> montarRanking(int periodo) {
		List<ItemRanking> ranking = new ArrayList<ItemRanking>();

		ControladorTick controladorTick = new ControladorTick();

		Date dataFinal = Util.getDataAtualNaHoraZero();
		List<String> acoes = Configuracao.getListaAtivos();
		for (String sigla : acoes) {
			Tick tickFinal = controladorTick.recuperarTickNaData(sigla, dataFinal);

			while (tickFinal == null) {
				dataFinal = Util.diminuiDiasUteis(dataFinal, 1);
				tickFinal = controladorTick.recuperarTickNaData(sigla, dataFinal);
			}

			Date dataInicial = dataFinal;

			switch (periodo) {
			case DIARIO:
				break;
			case SEMANAL:
				dataInicial = Util.getUltimoDiaUtilSemanaAnterior(dataFinal);
				break;
			case MENSAL:
				dataInicial = Util.getUltimoDiaUtilMesAnterior(dataFinal);
				break;
			case ANUAL:
				dataInicial = Util.getUltimoDiaUtilAnoAnterior(dataFinal);
				break;
			case TOTAL:
				// dataInicial = Util.getUltimoDiaUtilMesAnterior(dataFinal);
				break;
			}

			Tick tickInicial = controladorTick.recuperarTickNaData(sigla, dataInicial);

			while (tickInicial == null) {
				dataInicial = Util.diminuiDiasUteis(dataFinal, 1);
				tickInicial = controladorTick.recuperarTickNaData(sigla, dataInicial);
			}

			double retorno = tickFinal.getFechamento() / tickInicial.getFechamento() - 1;
			// System.out.println("Retorno " +
			// Util.formatarPercentagem(retorno));
			ItemRanking item = new ItemRanking(sigla, retorno);

			ranking.add(item);
		}

		Collections.sort(ranking);

		return ranking;
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		RankingRetorno r = new RankingRetorno();
		int periodo = SEMANAL;
		List<ItemRanking> ranking = r.montarRanking(periodo);

		switch (periodo) {
		case DIARIO:
			System.out.println("DIARIO");
			break;
		case SEMANAL:
			System.out.println("SEMANAL");
			break;
		case MENSAL:
			System.out.println("MENSAL");
			break;
		case ANUAL:
			System.out.println("ANUAL");
			break;
		case TOTAL:
			System.out.println("TOTAL");
			break;
		}

		for (ItemRanking item : ranking) {
			System.out.println(item.getAcao() + "  " + Util.formatarPercentagem(item.getRetorno()));
		}
	}
}
